Common Gateway Interface
최근 수정 시각: (5년 전)
1. 개요 [편집]
웹 서버에서 동적인 페이지를 보여 주기 위해 임의의 프로그램을 실행할 수 있도록 하는 기술 중 하나. 간혹 동적인 페이지는 다 CGI라고 생각하는 사람들이 있는데 CGI 말고도 이런 역할을 하는 기술은 여럿 있다. 단지 CGI가 맨 처음 나온 기술일 뿐.
원래 웹 서버는 서버에 저장되어 있는 고정된 문서를 보여 주는[1] 역할을 했다. 하지만 웹 서버에서 정보를 찾거나 기록을 하려면 웹 서버를 고쳐서 그런 기능을 넣어야 하는데 버틸 수 없으니, 대신 웹 서버가 특정한 URL로 들어가면 요청을 원하는 프로그램에 적절히 넘겨 주는 기술이 필요해졌는데 CGI가 그런 역할을 한다.
원래 웹 서버는 서버에 저장되어 있는 고정된 문서를 보여 주는[1] 역할을 했다. 하지만 웹 서버에서 정보를 찾거나 기록을 하려면 웹 서버를 고쳐서 그런 기능을 넣어야 하는데 버틸 수 없으니, 대신 웹 서버가 특정한 URL로 들어가면 요청을 원하는 프로그램에 적절히 넘겨 주는 기술이 필요해졌는데 CGI가 그런 역할을 한다.
2. 구조 [편집]
- (보통은 웹 브라우저 안에서, HTML의 폼을 통해) 요청이 웹 서버로 전달되면,
- 웹 서버는 요청에 들어 있는 주소가 CGI 프로그램에 대응되는지 확인해서,
- 대응되면 그 프로그램을 실행해서 환경 변수와 표준 입력의 형태로 요청을 전달한다. 어떻게 전달되는지는 표준이 있다.
- 웹 서버는 CGI 프로그램이 표준 출력으로 돌려 보낸 내용을 그대로 응답으로 돌려 준다.
참고로 좀 오래된 사이트에서 종종
/cgi-bin/으로 시작하는 주소를 볼 수 있는데, 이는 2번 과정에서 웹 서버가 해당 디렉토리에 들어 있는 프로그램을 모두 다 CGI 프로그램으로 인식하도록 되어 있는 경우이다. 요즘은 보안 문제 때문에 막무가내로 이런 식으로 하는 경우는 흔치 않고 웹 서버에서 설정할 수 있도록 해 놓는다. 2000년대 전후로 대한민국에도 인터넷 익스플로러를 통해 웹 브라우저로 접속이 가능해졌고, 그때쯤 붐이 일었던 개인 홈페이지 만들기에서 만든 홈페이지를 다른 사람과 교류하기위해 bbs프로그램을 계정에 설치해서 게시판 용도로 활용했는데, 이 극초창기때는 cgi가 개인 홈페이지 게시판 프로그램에 가장 널리 활용되었다. PHP는 개발 시기가 살짝 늦었고, 제로보드같은 php기반 게시판을 구동하려면 MySQL서버가 필요해서 유료로 서비스를 사용하기 때문에, 무료였던 cgi가 초창기의 주류였다. /cgi-bin/은 purybbs같은 무료 게시판 프로그램을 돌릴때 쓰던 디렉토리 지정 방식이었다.맨 처음에 CGI 프로그램은 C언어 같은 컴파일 되는 언어를 이용해서 만들어졌으나, 유지보수가 불편하다는 단점이 있었다. 그런데 웹 서버가 흔히 동작하는 유닉스 환경에서는 스크립트 언어를 마치 보통의 실행 파일처럼 실행하는 기능(
#!로 시작하는 파일들)이 있기 때문에, CGI 프로그램 또한 이러한 스크립트 언어를 통해 컴파일 없이 동작하는 방법으로 넘어가게 되었다. Perl이 사실은 딱히 웹 환경을 위해 만들어진 언어가 아님에도 한동안 인기를 끈 이유도, 사실 Perl이 CGI 라이브러리가 있는 (당시) 얼마 안 되는 스크립트 언어였기 때문이다.3. 단점 [편집]
이런 막강한 확장성을 가진 기술임에도 불구하고 CGI는 현재는 널리 쓰이지 않는데, 가장 큰 문제로 요청이 하나 들어 올 때마다 프로세스가 하나씩 실행된다는 것이 있다. 이는 특히 스크립트 언어에서 치명적이었는데 스크립트 언어에서는 보통 코드를 실행할 때마다 코드를 매번 해석해야 하기 때문이다. 물론 코드를 해석한 걸 캐싱하면 이 문제는 좀 나아지지만, 설령 C 언어 같은 언어로 미리 CGI 프로그램을 컴파일했다 하더라도 어지간한 환경에서는 프로세스 하나 실행하는데 몇 밀리초는 걸린다! 초당 수십건의 요청이 들어 오면 프로세스 실행하는 데만 시간을 다 소모할 것이다. 필요한 부분만 CGI로 만든다는 절충안을 쓴다 해도 요즘의 웹에는 동적인 것처럼 보이지 않아도 동적인 부분이 많기 때문에 적합하지 않다.
CGI를 대체하는 대부분의 기술들은 CGI의 이 단점을 해결하기 위해서 나온 게 보통이다. 몇 가지 예를 들면,
CGI를 대체하는 대부분의 기술들은 CGI의 이 단점을 해결하기 위해서 나온 게 보통이다. 몇 가지 예를 들면,
- 웹 서버가 직접 스크립트 언어를 해석하고 그 결과를 캐싱해서 빠르게 실행할 수 있도록 하는 경우가 있다. 특히 웹 서버 모듈로 확장 가능한 웹 서버에서 흔히 쓰이는데, 이 기술로 흥한 대표적인 언어가 바로 PHP이다(아파치 HTTP 서버의 mod_php 모듈). 근데 웃기게도 PHP 자체가 느려서[2] CGI를 안 쓰는 이득 중 상당수를 까먹는다(...). 그래도 CGI보다는 훨씬 빠르기 때문에 흥했다.
- 그냥 원하는 언어로 웹 서버를 짠다![3] 이 경우 해당 프로그램은 항상 실행되어 있고, 웹 서버는 그 내부 서버를 중개하는 역할만 하게 된다. 이 쯤 되면 웹 서버의 존재 의의가 없어질 것 같지만, 이러한 내부 웹 서버들은 전용 웹 서버들에 비해서 보안이나 설정 편의성 면에서 한계가 있게 마련이니 나쁜 건 아니다.
다만 임의의 프로그램을 웹 서버에서 실행할 수 있다는 이유 때문에 오늘날에도 CGI는 이런 저런 용도로 종종 쓰이며, 어지간한 웹 서버는 CGI를 다 지원한다고 해도 과언이 아니다.
[1] 그보다 좀 더 옛날에는 마치 위키같이 문서를 바꾸는 기능도 있었다! HTTP의 PUT 메소드가 그 흔적. 하지만 트롤링을 못 견디고 당연히 얼마 안 가 사라졌다.[2] 오늘날 많은 주요 스크립팅 언어는 코드를 읽어서 바로 해석하는 게 아니라 내부적으로 어느 정도의 컴파일을 거치는데, PHP는 이 과정이 있으나 마나 할 정도로 느린 주제에 이걸 캐싱하는 솔루션을 최적화 솔루션이랍시고 팔아 먹는 어이를 상실하게 만드는 전략을 가지고 있었다! 이 문제를 개발진도 인지하고 있었는지 PHP 7에서는 엔진을 완전히 교체해서 상당히 나아진 편이고, PHP8에서는 JIT 방식의 컴파일을 도입할 예정이다.[3] Python, Ruby on Rails 등이 대표적.
라이선스를 별도로 명시하지 않은 문서는 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다.
기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권을 갖습니다.
문서의 기여자는 역사 탭에서 확인할 수 있습니다.
접두어의 N: - 나무위키 사용자, R: - 리그베다 위키의 사용자를 뜻합니다.
자세한 사항은 나무위키에서 동일한 문서의 역사를 참고하시기 바랍니다.